1. callee
callee,返回正在执行的函数本身的引用,是arguments的一个属性。只有在函数执行时有效;有一个length属性,可用于获得形参的个数,来比较是否和实参个数一致,即比较arguments.length == arguments.callee.length;还可用于递归匿名参数;可以用来消除耦合。
1 | // 不用()()立即执行时,则无效。 |
2. caller
caller,返回一个对函数的引用,该函数调用了当前的函数。只有在函数执行时有效;如果函数由顶层调用,那么返回null。
1 | // 不用()()立即执行时,则无效。 |
3. call&apply
每个函数都包含两个非继承的方法,call和apply。他们的用途都是在特定的作用域中调用函数,获取了另一个对象的方法,并继承对象的属性,只是接收的参数格式不同。它们的重要作用在于能够扩充函数的作用域,而且对象不需要与函数有任何的耦合。
function.call(obj, arg1, arg2, ...)function.apply(obj, [param1, param2, ...])obj将代替函数中的this对象call中第二个参数是一个参数列表apply中第二个参数是一个数组,用来传参给函数中的arguments
1 | function Box(name, size){ |
使用时,如果希望输出结果的参数位置改变,如为Boxes(size, name, number),则使用call更方便Box.call(this, size, name)。而需要按照顺序对应的情况下,使用apply的数组参数arguments则更方便。
4. 其他一些高级用法
对于apply和call,还有一些特别的用法,鉴于它两并无太大区别,这里以apply为例。个人总结该用法如下,非标准表达:
1 | Fun.apply(Obj, arguments); |
解释为,Obj对象调用Fun内部提供的方法,对arguments参数进行操作,此处,Obj对象可为this,null等。此方法颇适用于需要传入列表而非数组表达的参数时,即param1, parram2, param3, ...而非[param1, param2, param3, ...]时。
以下三个示例,分别展示了表达式中Obj,Fun和arguments的含义:
1 | var arr = [1, 5, 3]; |
1 | function Arr(){ |
1 | function Box(name, size){ |